const path = require('path')
const webpack = require('webpack')
const packageJson = require('./package.json')
const GitRevisionPlugin = require('git-revision-webpack-plugin')
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')
// const SpeedMeasurePlugin = require('speed-measure-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const GitRevision = new GitRevisionPlugin()
const buildDate = JSON.stringify(new Date().toLocaleString())
const createThemeColorReplacerPlugin = require('./plugin.config')

// const smp = new SpeedMeasurePlugin({
//   outputFormat: 'human',
//   granularLoaderData: true,
//   disable: process.env.NODE_ENV === 'production'
// })

// 判断是否为开发环境
const isDev = process.env.NODE_ENV === 'development'
const isAnalyze = process.env.NODE_ENV === 'production' && process.env.ANALYZE === 'true'

function resolve (dir) {
  return path.join(__dirname, dir)
}

function getGitHash () {
  try {
    return GitRevision.version()
  } catch (e) { }
  return 'unknown'
}

const vueConfig = {
  publicPath: process.env.VUE_APP_BASE,
  configureWebpack: {
    // 开发环境关闭性能提示（避免启动时输出体积警告）
    performance: isDev ? {
      hints: false
    } : {},
    plugins: [
      // 生产环境才使用 MiniCssExtractPlugin（开发环境用 style-loader 更快）
      ...(isDev ? [] : [new MiniCssExtractPlugin({
        filename: 'css/[name].[contenthash:8].css',
        chunkFilename: 'css/[name].[contenthash:8].chunk.css'
      })]),
      new webpack.IgnorePlugin({
        contextRegExp: /^\.\/locale$/,
        resourceRegExp: /moment$/
      }),
      new webpack.DefinePlugin({
        APP_VERSION: `"${packageJson.version}"`,
        GIT_HASH: JSON.stringify(getGitHash()),
        BUILD_DATE: buildDate
      }),
      // 分析插件只在生产环境且需要时启用
      ...(isAnalyze ? [new BundleAnalyzerPlugin({
        analyzerMode: 'server',
        analyzerHost: '127.0.0.1',
        analyzerPort: 8888,
        reportFilename: 'report.html',
        defaultSizes: 'parsed',
        openAnalyzer: true,
        generateStatsFile: false,
        statsFilename: 'stats.json',
        statsOptions: null,
        logLevel: 'info'
      })] : [])
    ]
  },

  chainWebpack: config => {
    config.resolve.alias.set('@$', resolve('src'))

    // SVG 处理规则（保持不变）
    const svgRule = config.module.rule('svg')
    config.module.rules.delete('svg')

    config.module.rule('svg')
      .oneOf('svg_as_component')
      .resourceQuery(/inline/)
      .test(/\.(svg)(\?.*)?$/)
      .use('babel-loader')
      .loader('babel-loader')
      .end()
      .use('vue-svg-loader')
      .loader('vue-svg-loader')
      .options({
        svgo: {
          plugins: [
            { prefixIds: true },
            { cleanupIDs: true },
            { convertShapeToPath: false },
            { convertStyleToAttrs: true }
          ]
        }
      })
      .end()
      .end()
      .oneOf('svg_as_regular')
      .merge(svgRule.toConfig())
      .end()

    // 开发环境优化：增强缓存策略，减少重复构建
    config.cache({
      type: 'filesystem',
      cacheDirectory: path.resolve(__dirname, '.cache/vue-webpack'),
      // 开发环境缓存更多内容
      ...(isDev ? {
        buildDependencies: {
          config: [__filename] // 配置文件变化时才失效缓存
        },
        profile: true // 记录缓存命中信息，优化后续缓存
      } : {})
    })

    // 3. 保留 JS 的 thread-loader（不影响）
    if (isDev) {
      config.module.rule('js')
        .use('thread-loader')
        .loader('thread-loader')
        .before('babel-loader')
        .options({
          workers: Math.max(1, require('os').cpus().length - 1),
          workerParallelJobs: 50,
          poolTimeout: Infinity // 开发环境保持线程池不销毁（热更新更快）
        })
        .end()
    } else {
      // 生产环境使用原配置
      config.module.rule('js')
        .use('thread-loader')
        .loader('thread-loader')
        .before('babel-loader')
        .options({
          workers: Math.max(1, require('os').cpus().length - 1),
          workerParallelJobs: 50,
          poolTimeout: 2000
        })
        .end()
    }

    // 4. 移除 SCSS 的 thread-loader（避免冲突）
    config.module.rule('scss').uses.delete('thread-loader')

    // 5. 不再手动配置 mini-css-extract-plugin.loader，交由 Vue CLI 自动处理

    // 开发环境：简化 sourceMap（加快构建速度）
    if (isDev) {
      config.devtool('eval-cheap-module-source-map') // 比默认的 eval-source-map 更快
    }

    // 开发环境：关闭不必要的性能分析插件
    if (isDev) {
      config.plugins.delete('prefetch') // 预加载在开发环境无用，且拖慢启动
      config.plugins.delete('preload') // 同上
    }
  },

  css: {
    // 开发环境不提取 CSS（用 style-loader 更快，热更新更流畅）
    extract: !isDev,
    loaderOptions: {
      scss: {
        api: 'modern'
      },
      less: {
        modifyVars: {
          'border-radius-base': '2px'
        },
        javascriptEnabled: true
      }
    }
  },

  devServer: {
    port: 8000,
    // 开发环境：启用热更新（默认开启，显式配置确保生效）
    hot: true,
    // 移除 client.reload（旧版本不支持）
    // 使用 liveReload: false 替代（阻止自动刷新整个页面）
    liveReload: false,
    client: {
      logging: 'warn', // 只输出警告和错误
      overlay: {
        warnings: false, // 警告不显示全屏覆盖
        errors: true // 错误显示全屏覆盖
      },
      // 使用 reconnect 替代 reload（根据你的版本兼容情况选择）
      reconnect: false // 热更新失败时不尝试重新连接
    },
    proxy: {
      '/its/v2/api/': {
        target: process.env.VUE_APP_INVOICE_PROXY,
        ws: false,
        secure: false,
        changeOrigin: true
      },
      // 修正代理前缀，去掉多余的/its
      '/api/swan-cloud-settle-its': {
        target: process.env.VUE_APP_ODLAPI_PROXY,
        // pathRewrite: { '^/api/swan-cloud-settle-its': '' }, // 去掉前缀，转发到后端实际路径
        ws: false,
        secure: false,
        changeOrigin: true
      },
      '/its/api': {
        target: process.env.VUE_APP_API_PROXY,
        pathRewrite: { '^/its/api': '' },
        ws: false,
        secure: false,
        changeOrigin: true
      },
      '/its/minio': {
        target: process.env.VUE_APP_MINIO_PROXY,
        pathRewrite: { '^/its/minio': '' },
        ws: false,
        secure: false,
        changeOrigin: true
      }
    }
  },

  productionSourceMap: false,
  lintOnSave: undefined,
  transpileDependencies: []
}

vueConfig.configureWebpack.plugins.push(createThemeColorReplacerPlugin())
module.exports = vueConfig
